package com.tjetc.service.impl;

import com.tjetc.common.FileUploadUtil;
import com.tjetc.common.JsonResult;
import com.tjetc.dao.TravelGuideMapper;
import com.tjetc.entity.TravelGuide;
import com.tjetc.service.TravelGuideService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 旅游攻略服务实现类
 * 实现TravelGuideService接口中定义的所有业务逻辑方法
 * 包含攻略的CRUD操作和交互功能的具体实现
 */
@Service
public class TravelGuideServiceImpl implements TravelGuideService {

    /**
     * 文件上传基础路径，从配置文件中注入
     */
    @Value("${file.basePath}")
    private String basePath;

    /**
     * 注入攻略数据访问对象，用于数据库操作
     */
    @Autowired
    private TravelGuideMapper travelGuideMapper;

    /**
     * 注入文件上传工具类，用于处理文件上传
     * 如果此处报错，请确保已定义并注册FileUploadUtil类
     */
    @Autowired
    private FileUploadUtil fileUploadUtil;

    /**
     * 根据ID查询攻略详情
     * 查询成功后会自动增加该攻略的浏览量
     * 如果攻略不存在，则返回错误信息
     *
     * @param id 攻略ID
     * @return 包含攻略对象或错误信息的JsonResult
     */
    @Override
    public JsonResult findGuideById(Long id) {
        TravelGuide guide = travelGuideMapper.findGuideById(id);
        if (guide != null) {
            // 增加浏览量
            travelGuideMapper.incrementViewCount(id);
            return JsonResult.success("查询攻略成功", guide);
        }
        return JsonResult.success("攻略不存在");
    }

    /**
     * 获取热门攻略列表
     * 按照浏览量从高到低排序，返回指定数量的攻略
     *
     * @param limit 返回的最大记录数量
     * @return 包含热门攻略列表的JsonResult
     */
    @Override
    public JsonResult getHotGuides(Integer limit) {
        List<TravelGuide> guides = travelGuideMapper.hotGuides(limit);
        return JsonResult.success("热门攻略查询成功", guides);
    }

    /**
     * 根据目的地查询攻略
     * 使用模糊查询，查找目的地字段中包含指定文本的所有攻略
     *
     * @param destination 目的地名称（全部或部分）
     * @return 包含匹配目的地攻略列表的JsonResult
     */
    @Override
    public JsonResult findByDestination(String destination) {
        List<TravelGuide> guides = travelGuideMapper.findByDestination(destination);
        return JsonResult.success("目的地攻略查询成功", guides);
    }

    /**
     * 查询指定作者的所有攻略
     * 返回指定作者创建的所有攻略，按创建时间排序
     *
     * @param authorId 作者ID
     * @return 包含作者攻略列表的JsonResult
     */
    @Override
    public JsonResult findByAuthor(Long authorId) {
        List<TravelGuide> guides = travelGuideMapper.findByAuthor(authorId);
        return JsonResult.success("作者攻略查询成功", guides);
    }

    /**
     * 获取推荐攻略列表
     * 返回系统标记为推荐的攻略，数量由参数控制
     *
     * @param limit 返回的最大记录数量
     * @return 包含推荐攻略列表的JsonResult
     */
    @Override
    public JsonResult getFeatured(Integer limit) {
        List<TravelGuide> guides = travelGuideMapper.findFeatured(limit);
        return JsonResult.success("推荐攻略查询成功", guides);
    }

    /**
     * 获取编辑推荐的攻略列表
     * 返回被编辑推荐的攻略，数量由参数控制
     *
     * @param limit 返回的最大记录数量
     * @return 包含编辑推荐攻略列表的JsonResult
     */
    @Override
    public JsonResult getEditorChoice(Integer limit) {
        List<TravelGuide> guides = travelGuideMapper.findEditorChoice(limit);
        return JsonResult.success("编辑推荐攻略查询成功", guides);
    }

    /**
     * 创建新攻略
     * 设置攻略的初始状态和统计数据，然后保存到数据库
     * 包含事务管理，确保数据一致性
     *
     * @param guide 攻略对象，包含基本信息和行程数据
     * @return 包含创建结果和攻略信息的JsonResult
     */
    @Override
    @Transactional
    public JsonResult createGuide(TravelGuide guide) {
        // Set initial values
        guide.setCreateTime(LocalDateTime.now());
        guide.setUpdateTime(LocalDateTime.now());
        guide.setViewCount(0L);
        guide.setLikeCount(0L);
        guide.setFavoriteCount(0L);
        guide.setCommentCount(0L);
        guide.setEditCount(0L);
        guide.setStatus(1); // Default to published status

        // Check if tripData is null and provide a default value
        if (guide.getTripData() == null) {
            // Create a default JSON structure
            guide.setTripData("{\"title\":\"" + guide.getTitle() + "\",\"destination\":\"" + guide.getDestination() + "\"}");
        }

        // Insert data
        int result = travelGuideMapper.insert(guide);
        if (result > 0) {
            return JsonResult.success("创建攻略成功", guide);
        }
        return JsonResult.success("创建攻略失败");
    }

    /**
     * 更新攻略信息
     * 更新攻略的内容，同时更新修改时间和增加编辑次数
     * 包含事务管理，确保数据一致性
     *
     * @param guide 更新后的攻略对象
     * @return 包含更新结果和攻略信息的JsonResult
     */
    @Override
    @Transactional
    public JsonResult updateGuide(TravelGuide guide) {
        // 更新时间
        guide.setUpdateTime(LocalDateTime.now());

        // 增加编辑次数
        travelGuideMapper.incrementEditCount(guide.getGuideId());

        // 更新数据
        int result = travelGuideMapper.updateById(guide);
        if (result > 0) {
            return JsonResult.success("更新攻略成功", guide);
        }
        return JsonResult.success("更新攻略失败");
    }

    /**
     * 删除攻略
     * 执行逻辑删除，将攻略状态设置为已删除(3)，而不是物理删除
     * 包含事务管理，确保数据一致性
     *
     * @param id 要删除的攻略ID
     * @return 包含删除结果的JsonResult
     */
    @Override
    @Transactional
    public JsonResult deleteGuide(Long id) {
        // 只做逻辑删除，将状态改为已删除
        TravelGuide guide = travelGuideMapper.findGuideById(id);
        if (guide != null) {
            guide.setStatus(3); // 3表示已删除
            guide.setUpdateTime(LocalDateTime.now());
            int result = travelGuideMapper.updateById(guide);
            if (result > 0) {
                return JsonResult.success("删除攻略成功");
            }
        }
        return JsonResult.success("删除攻略失败");
    }

    /**
     * 上传攻略封面图片
     * 将图片保存到服务器指定目录，并更新攻略的封面图片路径
     * 处理上传过程中可能发生的异常
     *
     * @param file 上传的图片文件
     * @param guideId 攻略ID
     * @return 包含上传结果和图片路径的JsonResult
     */
    @Override
    public JsonResult uploadCoverImage(MultipartFile file, Long guideId) {
        TravelGuide guide = travelGuideMapper.findGuideById(guideId);
        if (guide == null) {
            return JsonResult.success("攻略不存在");
        }

        try {
            // 上传文件到服务器，返回路径
            String filePath = fileUploadUtil.upload(file, basePath + "/travel_guide/cover");

            // 更新攻略封面路径
            guide.setCoverImage(filePath);
            guide.setUpdateTime(LocalDateTime.now());
            travelGuideMapper.updateById(guide);

            return JsonResult.success("上传封面成功", filePath);
        } catch (Exception e) {
            e.printStackTrace();
            return JsonResult.success("上传封面失败：" + e.getMessage());
        }
    }

    /**
     * 增加攻略浏览量
     * 将指定攻略的浏览次数加1
     * 包含事务管理，确保数据一致性
     *
     * @param guideId 攻略ID
     * @return 包含操作结果的JsonResult
     */
    @Override
    @Transactional
    public JsonResult incrementView(Long guideId) {
        travelGuideMapper.incrementViewCount(guideId);
        return JsonResult.success("增加浏览量成功");
    }

    /**
     * 点赞攻略
     * 将指定攻略的点赞次数加1
     * 包含事务管理，确保数据一致性
     *
     * @param guideId 攻略ID
     * @return 包含操作结果的JsonResult
     */
    @Override
    @Transactional
    public JsonResult likeGuide(Long guideId) {
        travelGuideMapper.incrementLikeCount(guideId);
        return JsonResult.success("点赞成功");
    }

    /**
     * 收藏攻略
     * 将指定攻略的收藏次数加1
     * 包含事务管理，确保数据一致性
     *
     * @param guideId 攻略ID
     * @return 包含操作结果的JsonResult
     */
    @Override
    @Transactional
    public JsonResult favoriteGuide(Long guideId) {
        travelGuideMapper.incrementFavoriteCount(guideId);
        return JsonResult.success("收藏成功");
    }
}